using System;
#if (PocketPC || Smartphone || WindowsCE)
#else
using System.Runtime.Serialization;
#endif

namespace RaisingStudio.Common.Exceptions
{
	/// <summary>
	/// A ConfigurationException is thrown when an error has occured in the configuration process.
	/// </summary>
	/// <remarks>
	/// When this exception occurs check the .xml or .config file.
	/// </remarks>
	[Serializable]
    public class ConfigurationException : ExceptionBase
	{
		/// <summary>
        /// Initializes a new instance of the <see cref="RaisingStudio.Data.Common.Exceptions.ConfigurationException"/> class.
		/// </summary>
		/// <remarks>
		/// This constructor initializes the Message property of the new instance to a system-supplied message 
		/// that describes the error. 
		/// </remarks>
        public ConfigurationException()
            : base("Could not configure the component.")
        {
        }

		/// <summary>
        /// Initializes a new instance of the <see cref="RaisingStudio.Data.Common.Exceptions.ConfigurationException"/> 
		/// class with a reference to the inner exception that is the cause of this exception.
		/// </summary>
		/// <remarks>
		/// This constructor initializes the Message property of the new instance to the Message property 
		/// of the passed in exception. 
		/// </remarks>
		/// <param name="ex">
		/// The exception that is the cause of the current exception. 
		/// If the innerException parameter is not a null reference (Nothing in Visual Basic), 
		/// the current exception is raised in a catch block that handles the inner exception.
		/// </param>
        public ConfigurationException(Exception ex)
            : base(ex.Message, ex)
        {
        }

		/// <summary>
        /// Initializes a new instance of the <see cref="RaisingStudio.Data.Common.Exceptions.ConfigurationException"/> 
		/// class with a specified error message.
		/// </summary>
		/// <remarks>
		/// This constructor initializes the Message property of the new instance using 
		/// the message parameter.
		/// </remarks>
		/// <param name="message">The message that describes the error.</param>
        public ConfigurationException(string message)
            : base(message)
        {
        }

		/// <summary>
        /// Initializes a new instance of the <see cref="RaisingStudio.Data.Common.Exceptions.ConfigurationException"/> 
		/// class with a specified error message and a reference to the inner exception that is the cause of this exception.
		/// </summary>
		/// <remarks>
		/// An exception that is thrown as a direct result of a previous exception should include a reference to the previous exception in the InnerException property. 
		/// The InnerException property returns the same value that is passed into the constructor, or a null reference (Nothing in Visual Basic) if the InnerException property does not supply the inner exception value to the constructor.
		/// </remarks>
		/// <param name="message">The message that describes the error.</param>
		/// <param name="inner">The exception that caused the error</param>
        public ConfigurationException(string message, Exception innerException)
            : base(message, innerException)
        {
        }

#if (PocketPC || Smartphone || WindowsCE)
#else
        /// <summary>
		/// Initializes a new instance of the Exception class with serialized data.
		/// </summary>
		/// <remarks>
		/// This constructor is called during deserialization to reconstitute the exception 
		/// object transmitted over a stream.
		/// </remarks>
		/// <param name="info">
		/// The <see cref="System.Runtime.Serialization.SerializationInfo"/> that holds the serialized object data about the exception being thrown.
		/// </param>
		/// <param name="context">
		/// The <see cref="System.Runtime.Serialization.StreamingContext"/> that contains contextual information about the source or destination. 
		/// </param>
        protected ConfigurationException(SerializationInfo info, StreamingContext context)
            : base(info, context)
        {
        }
#endif
	}
}
